package org.dei.perla.utils.messages;

import org.dei.perla.sys.device.channel.frame.address.FrameAddress;
import org.dei.perla.utils.pipe.Pipe;

/**
 * Messaggio scambiato tra Adapter Server e FPC Factory
 *
 */
public class AdapterFpcMessage extends Message{
	
	/**
	 * Pipe di lettura
	 */
	private Pipe pPipeIn;
	
	/**
	 * Pipe di scrittura
	 */
	private Pipe pPipeOut;
	
	/**
	 * Flag per indicare il tipo di messaggio
	 */
	private int pFlag;
	
	/**
	 * Identificatore di canale virtuale di binding
	 */
	private int pBvci;
	
	/**
	 * Costruttore non parametrico
	 *
	 */
	public AdapterFpcMessage(){
		
		this.pAddress = null;
		this.pPayload = null;
		this.pPipeIn = null;
		this.pPipeOut = null;
		this.pFlag = 0;
	}
	
	/**
	 * Costruttore, inizializza un messaggio contenente un indirizzo e il payload.
	 * @param parAddress Indirizzo da inviare
	 * @param parPayload Payload da inviare
	 */
	public AdapterFpcMessage(FrameAddress parAddress, byte[] parPayload) {
		this.pAddress = parAddress;
		this.pPayload = parPayload;
	}
	
	/**
	 * Costruttore per messaggio di binding
	 * 
	 * @param payload, contenuto del messaggio
	 * @param pipeIn, pipe di lettura
	 * @param pipeOut, pipe di scrittura
	 * @param flag, per indicare il tipo di messaggio
	 */
	public AdapterFpcMessage(byte[] parPayload, Pipe parPipeIn, Pipe parPipeOut, int parFlag, FrameAddress parFrameAddress){
		
		this.pAddress = parFrameAddress;
		this.pPayload = parPayload;
		this.pPipeIn = parPipeIn;
		this.pPipeOut = parPipeOut;
		this.pFlag = parFlag;
		
	}
	
	/**
	 * Costruttore per un messaggio di ack
	 * 
	 * @param bvci, identificatore del canale virtuale di binding
	 * @param flag, per indicare il tipo di messaggio
	 */
	public AdapterFpcMessage(int parBvci, int parFlag, FrameAddress parFrameAddress){
		
		this.pAddress = parFrameAddress;
		this.pBvci = parBvci;
		this.pFlag = parFlag;
		
	}
	
	public String toString(){
			
		String s = "AdapterFpcFactoryPacket( ";
		if (pAddress != null) {
			s += pAddress.toString();
		} else {
			s += "addr: null";
		}
	
		s += ", ";
	
		if (pPayload != null) {
			s += "payload : { ";
			for (int i = 0; i < pPayload.length; i++) {
				s += (int) pPayload[i];
				if (i != pPayload.length - 1) {
					s += ", ";
				}
			}
			s += " } ";
		} else {
			s += "{ null }";
		}
	
		s += " )\n";
		return s;
	}

	
	/*
	 * Metodi getter e setter
	 */
	
	public int getFlag() {
		return pFlag;
	}

	public void setFlag(int flag) {
		this.pFlag = flag;
	}

	public Pipe getPipeIn() {
		return pPipeIn;
	}

	public void setPipeIn(Pipe pipeIn) {
		this.pPipeIn = pipeIn;
	}

	public Pipe getPipeOut() {
		return pPipeOut;
	}

	public void setPipeOut(Pipe pipeOut) {
		this.pPipeOut = pipeOut;
	}

	public int getBvci() {
		return pBvci;
	}

	public void setBvci(int bvci) {
		this.pBvci = bvci;
	}

	
}
